import { BaseResult } from '@/types/axios'
import { UserInfo } from '@/types/store'
import avatar from '@imgs/user/avatar.png'
import { ElMessage } from 'element-plus'
import request from "../request/request"
import axios from 'axios'
const API_PREFIX = '/static'
// 用户接口响应数据类型
interface LoginResponse {
  code: number;
  msg: string;
  message: string;
  data: {
    token: string;
    userInfo: {
      id: number;
      nickname: string;
      real_name: string;
      password: string;
      email: string;
      name: string;
      avatar: string;
      group: Array<{
        id: number;
        alias: string;
        label: string;
        remark: string;
        sort: number;
        status: number;
        menus: any[] | null;
      }>;
    };
  };
}

export class UserService {
  // 登录接口，向后端发送POST请求
  static async login(options: { body: string }): Promise<BaseResult> {
    try {
      // 解析登录信息
      const loginData = JSON.parse(options.body);
      
      // 使用axios发送POST请求到后端
      const response = await request.post(API_PREFIX+'/user/login', {
        username: loginData.username,
        password: loginData.password
      });
      console.log(response);
      // 获取响应数据
      const responseData: LoginResponse = {
        code: response.code,
        msg: response.msg,
        message: response.message || response.msg,
        data: response.data
      };
      
      // 检查响应数据是否存在
      if (!responseData) {
        return {
          code: 500,
          message: '服务器响应数据为空',
          data: null
        };
      }
      
      // 检查登录是否成功
      if (responseData.code === 200 && responseData.data) {        
        // 存储token到localStorage和sessionStorage
        const token = responseData.data.token;
        localStorage.setItem('token', token);
        sessionStorage.setItem('accessToken', token);
        
        console.log('登录成功，已存储token:', token); // 调试信息
        
        // 存储用户信息到localStorage
        localStorage.setItem('userInfo', JSON.stringify(responseData.data.userInfo));
        
        // 返回成功响应
        return {
          code: 200,
          message: responseData.message || '登录成功',
          data: {
            accessToken: token
          }
        };
      } else {
        console.log(responseData);
        // 返回错误响应
        return {
          code: responseData.code || 401,
          message: responseData.msg || '登录失败',
          data: null
        };
      }
    } catch (error) {
      console.error('登录请求出错:', error);
      
      // 获取axios错误信息
      let errorMessage = '登录请求失败';
      if (axios.isAxiosError(error)) {
        // 更详细地检查axios错误
        if (error.response) {
          // 服务器响应了错误状态码
          const responseData = error.response.data;
          errorMessage = responseData?.message || responseData?.msg || `服务器错误 (${error.response.status})`;
          
          return {
            code: error.response.status || 500,
            message: errorMessage,
            data: null
          };
        } else if (error.request) {
          // 请求已发送但没有收到响应
          errorMessage = '服务器未响应，请检查网络连接';
        } else {
          // 设置请求时出现问题
          errorMessage = error.message || '请求配置错误';
        }
      } else if (error instanceof Error) {
        errorMessage = error.message;
      }
      
      // 返回错误响应
      return {
        code: 500,
        message: errorMessage,
        data: null
      };
    }
  }

  // 退出登录，清空localStorage
  static async logout(): Promise<BaseResult> {
    try {
      try {
        // 尝试向后端发送退出登录请求
        const response = await request.post(API_PREFIX+'/user/logout');
        console.log('成功发送退出登录请求:', response);
      } catch (e) {
        // 即使后端请求失败，仍继续处理本地登出
        console.warn('退出登录请求失败，但会继续清空本地数据:', e);
      }
      
      // 清空localStorage中的所有内容
      localStorage.clear();
      
      // 提示用户已退出登录
      ElMessage.success({
        message: '已成功退出登录',
        type: 'success',
        duration: 2000
      });
      
      // 返回成功响应
      return {
        code: 200,
        message: '退出登录成功',
        data: null
      };
    } catch (error) {
      console.error('退出登录处理出错:', error);
      
      // 尽管发生错误，仍然清空localStorage
      localStorage.clear();
      
      // 返回错误响应
      return {
        code: 500,
        message: '退出登录处理出错，但已清空本地登录信息',
        data: null
      };
    }
  }

  // 获取用户信息 - 从localStorage获取存储的用户信息
  static getUserInfo(): Promise<BaseResult<UserInfo>> {
    return new Promise((resolve) => {
      try {
        // 从localStorage获取用户信息
        const userInfoString = localStorage.getItem('userInfo');
        
        if (userInfoString) {
          try {
            const storedUserInfo = JSON.parse(userInfoString);
            
            // 验证存储的用户信息是否有效
            if (storedUserInfo && typeof storedUserInfo === 'object') {
              // 返回用户信息
              resolve({
                code: 200,
                message: '获取用户信息成功',
                data: {
                  id: storedUserInfo.id || 1,
                  name: storedUserInfo.real_name || storedUserInfo.name || '未知用户',
                  username: storedUserInfo.name || 'Unknown User',
                  avatar: storedUserInfo.avatar || avatar,
                  email: storedUserInfo.email || 'art.design@gmail.com'
                }
              });
              return;
            }
          } catch (parseError) {
            console.error('解析存储的用户信息失败:', parseError);
            // 解析失败时继续执行，返回默认值
          }
        } 
        
        // 若localStorage中无有效用户信息，返回默认值
        resolve({
          code: 200,
          message: '获取用户信息成功（使用默认值）',
          data: {
            id: 1,
            name: '未知用户',
            username: 'Unknown User',
            avatar: avatar,
            email: 'art.design@gmail.com'
          }
        });
      } catch (error) {
        console.error('获取用户信息失败:', error);
        
        // 返回默认用户信息
        resolve({
          code: 200,
          message: '获取用户信息成功（出错后使用默认值）',
          data: {
            id: 1,
            name: '默认用户',
            username: 'Default User',
            avatar: avatar,
            email: 'art.design@gmail.com'
          }
        });
      }
    });
  }
}
